#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/configfs.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/device.h>
#include <linux/sysfs.h>

int mybus_match(struct device *dev, struct device_driver *drv)
{
    // 检查设备名称和驱动程序名称是否匹配
    printk("mybus_match ==============");
    return (strcmp(dev_name(dev), drv->name) == 0);
};

int mybus_probe(struct device *dev)
{
    struct device_driver *drv = dev->driver;
    if (drv->probe)
        drv->probe(dev);
    printk("mybus_probe ==============");
    return 0;
};

struct bus_type mybus = {
    .name = "mybus",      // 总线的名称
    .match = mybus_match, // 设备和驱动程序匹配的回调函数
    .probe = mybus_probe, // 设备探测的回调函数
};

EXPORT_SYMBOL_GPL(mybus); // 导出总线符号

ssize_t mybus_show(struct bus_type *bus, char *buf)
{

    printk("mybus_show ==============");

    // 在 sysfs 中显示总线的值
    return sprintf(buf, "%s\n", "mybus_show");
};

struct bus_attribute mybus_attr = {
    .attr = {
        .name = "value", // 属性的名称
        .mode = 0664,    // 属性的访问权限
    },
    .show = mybus_show, // 属性的 show 回调函数
};

// 模块的初始化函数
static int bus_init(void)
{
    int ret;
    ret = bus_register(&mybus);                 // 注册总线
    ret = bus_create_file(&mybus, &mybus_attr); // 在 sysfs 中创建属性文件

    return 0;
}

// 模块退出函数
static void bus_exit(void)
{
    bus_remove_file(&mybus, &mybus_attr); // 从 sysfs 中移除属性文件
    bus_unregister(&mybus);               // 取消注册总线
}

module_init(bus_init); // 指定模块的初始化函数
module_exit(bus_exit); // 指定模块的退出函数

MODULE_LICENSE("GPL");     // 模块使用的许可证
MODULE_AUTHOR("fangchen"); // 模块的作者